package com.hsc.mvc.bind;

import com.hsc.mvc.ParameterSource;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Parameter;

/**
 * @author
 * @date 2025-06-02
 * @Description Servlet相关对象参数绑定器 ， 1个参数对应的1个Servlet对象
 * ● 只针对 request，response，session三种类型进行绑定
 * ● 理论上是不需要@RequestParam注解，直接通过参数类型判断是否支持。
 */
public class ServletParameterBinder implements ParameterBindStrategy {
    @Override
    public Object bind(Parameter parameter, ParameterSource parameterSource) {
        //  controller 的方法中如果是 HttpServletRequest, HttpServletResponse, HttpSession
        // 直接进行设置 保存
        Class<?> type = parameter.getType();
        if (type == HttpServletRequest.class) {
            return parameterSource.getRequest();
        } else if (type == HttpServletResponse.class) {
            return parameterSource.getResponse();
        } else if (type == HttpSession.class) {
            return parameterSource.getSession();
        }
        return null;
    }

    /**
     * 判断当前类型是否支持该参数绑定器
     *
     * @param parameter
     * @return
     */
    @Override
    public boolean isSupport(Parameter parameter) {
        Class<?> type = parameter.getType();
        return type == HttpServletRequest.class || type == HttpServletResponse.class || type == HttpSession.class;
    }
}
